SportsClient.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. "use client";
  2. import { GameInfo } from "@/api/home";
  3. import { useRouter } from "@/i18n/routing";
  4. import { server } from "@/utils/client";
  5. import { useTranslations } from "next-intl";
  6. import Script from "next/script";
  7. import { FC, useEffect, useRef,useState } from "react";
  8. interface Props {
  9. brand_id: string;
  10. token: string;
  11. }
  12. // dedprz | deepwin365 | damslots | chips | deloro-casino
  13. const SportsClient: FC<Props> = (props) => {
  14. const t = useTranslations("ProfilePage");
  15. const { brand_id, token } = props;
  16. const [currentToken, setCurrentToken] = useState(token);
  17. const btRef = useRef(null);
  18. const router = useRouter();
  19. useEffect(() => {
  20. // @ts-ignore
  21. if (window.BTRenderer) {
  22. onLoad();
  23. }
  24. // 离开体育页的时候需要kill掉
  25. return () => {
  26. // @ts-ignore
  27. btRef.current?.kill();
  28. };
  29. }, []);
  30. useEffect(() => {
  31. // 如果token更新了才调用update
  32. if( currentToken !== token){
  33. updateToken(token);
  34. }
  35. }, [token]);
  36. const getGameDetailApi = async () => {
  37. const data = await server
  38. .request<GameInfo>({
  39. url: "/v1/api/front/game_info_by_id",
  40. method: "post",
  41. data: { id: "sportsBet", mode: 1 },
  42. })
  43. .then((res) => {
  44. if (res.code === 200) {
  45. setCurrentToken(res.data.game_url)
  46. return res.data.game_url;
  47. } else {
  48. return "";
  49. }
  50. });
  51. return data;
  52. };
  53. const updateToken = (newToken: string) => {
  54. // @ts-ignore
  55. if(currentToken!== newToken){
  56. setCurrentToken(newToken);
  57. }
  58. // @ts-ignore
  59. if (window.BTRenderer) {
  60. onLoad();
  61. }
  62. }
  63. const onLoad = () => {
  64. // @ts-ignore
  65. const bt = new BTRenderer();
  66. btRef.current = bt;
  67. // bt.updateOptions({url:'/'})
  68. bt.initialize({
  69. brand_id: brand_id,
  70. token: token,//使用最新的token
  71. onTokenExpired: getGameDetailApi, //过期自动更新token
  72. onSessionRefresh: () => {
  73. // 销毁之前的实例并等待刷新完成
  74. if(btRef.current){
  75. // @ts-ignore
  76. btRef.current?.kill();
  77. }
  78. router.refresh()
  79. },
  80. themeName: "default",
  81. lang: "pt-br",
  82. target: document.getElementById("betby"),
  83. betSlipOffsetBottom: 80,
  84. // betSlipOffsetRight: 750,
  85. betSlipZIndex: 1000,
  86. stickyTop: 0,
  87. betSlipOffsetTop: 50,
  88. onRecharge: function () {
  89. router.push("/deposit");
  90. },
  91. onRouteChange: function () {
  92. },
  93. onLogin: function () {},
  94. onRegister: function () {},
  95. onBetSlipStateChange: function () {},
  96. });
  97. };
  98. return (
  99. <>
  100. <div id="betby" className={"h-[100%]"}></div>
  101. <Script src={"https://ui.invisiblesport.com/bt-renderer.min.js"} onLoad={onLoad} />
  102. </>
  103. );
  104. };
  105. export default SportsClient;